/*
 * ComponenteDistribuidorGeneradorMetodo.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 2/03/2011, 07:30:49 PM
 */

package com.ufps.cuatro.modelo.representacion.componente;

import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.representacion.TipoMetodo;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.generadores.codeobject.CodeContextLine;
import com.ufps.cuatro.util.generadores.codeobject.EnumTypeCodeSyntax;
import java.util.ArrayList;

/**
 * <i><b>ComponenteDistribuidorGeneradorMetodo:</b></i>Esta Clase abstracta es la Base para la Representación de los
 * métodos del modelo analizado.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 2/03/2011
 * @see ComponenteGeneradorjectBase
 * @see Ob
 */
public abstract class ComponenteDistribuidorGeneradorMetodo extends ComponenteDistribuidorGenerador{
    private static final long serialVersionUID = -5315490277300877314L;
    
    private int idClaseComponenteGeneradorMetodo;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGeneradorMetodo;            
    /**
     * Contiene la Cadena de Definición <code>ClassPath</code> del Tipo de Dato.
     */
    protected String strClassPathMetodo;
    /**
     * Indica el Tipo de método (simple, get, set, standard).
     */
    protected TipoMetodo eMetodo;        
    /**
     * Contiene el Nombre del Método..
     */
    protected String strMetodo;

    /** 
     * Constructor por Defecto.      
     * @param objComponenteBase 
     * @param strClassPathTipoDato 
     * @param modo modo de operación.
     * @param heredado indica si el Objeto es parte de una cadena de herencia o es un objeto final.
     * @param previsualizar  indica si el objeto puede generar vistas previas.
     */
    public ComponenteDistribuidorGeneradorMetodo(ComponenteBaseStandar objComponenteBase, String strClassPathTipoDato, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, strClassPathTipoDato, true, true);
        this.heredado = heredado;
        this.previsualizar = previsualizar;                        
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.generador.metodo");  
        if(!heredado){
            this.idClaseComponenteGeneradorMetodo = (!previsualizar) ?
            ComponenteDistribuidorGeneradorMetodo.serialIdComponenteGeneradorMetodo++ :
            ComponenteDistribuidorGeneradorMetodo.serialIdComponenteGeneradorMetodo;        
        } 
        this.strSimpleClassPathTipoDato = "";
    }

    public String getStrMetodo() {
        return strMetodo;
    }

    public void setStrMetodo(String strMetodo) {
        this.strMetodo = strMetodo;
    }    

    /**
     * Devuelve el id de creación del Componente. No se debe confundir con el #getId()
     * @return Id de Definición de la Clase.
     */
    public int getIdClaseComponenteGeneradorMetodo() {
        return idClaseComponenteGeneradorMetodo;
    }    

    @Override    
    public String toString() {
        if(this.eBiblioteca == TipoBiblioteca.eSwap) {
            return this.objClassSwing.getSimpleName() + "IdCGMBI" + this.idClaseComponenteGeneradorMetodo;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
            return this.objClassSwing.getSimpleName() + "IdCGMBL" + this.idClaseComponenteGeneradorMetodo;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
            return this.objClassSwing.getSimpleName() + "IdCGMBG" + this.idClaseComponenteGeneradorMetodo;
        }
        else if(this.getObjPropiedadesDisponibles() != null){            
            //se evalua si la propiedad name ha sido inicializada
            if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                return this.getName();
            }
        }
        return this.objClassSwing.getSimpleName() + this.dni + this.idClaseComponenteGeneradorMetodo;
    }    
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof ComponenteDistribuidorGeneradorMetodo){
            ComponenteDistribuidorGeneradorMetodo objComponente = (ComponenteDistribuidorGeneradorMetodo) obj;
            return this.toString().equals(objComponente.toString());
        }
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
        int hash = 7;
        return hash;
    }    

    /**
     * Actualiza el id de clase en los procesos de Importación desde Bibliotecas.
     * @param id nuevo id.
     */
    public abstract void importId(int id);

    @Override
    public int compareTo(Object o) {
        ComponenteDistribuidorGeneradorMetodo obj = (ComponenteDistribuidorGeneradorMetodo) o;
        if(this.idClaseComponenteGeneradorMetodo > obj.idClaseComponenteGeneradorMetodo) {
            return 1;
        }
        else if(this.idClaseComponenteGeneradorMetodo < obj.idClaseComponenteGeneradorMetodo) {
            return -1;
        }
        else {
            return 0;
        }
    }    

    /**
     * Devuelve la Cadena de Definición <code>ClassPath</code> del Tipo de Dato.
     * @return @DefinicionReturn
     */
    public String getStrClassPathMetodo() {
        return strClassPathMetodo;
    }

    /**
     * Establece la Cadena de Definición <code>ClassPath</code> del Tipo de Dato.
     * @param strClassPathMetodo Cadena de Definición <code>ClassPath</code> del Tipo de Dato.
     */
    public void setStrClassPathMetodo(String strClassPathMetodo) {
        this.strClassPathMetodo = strClassPathMetodo;
    }   
    
    /**
     * Devuelve el Tipo de método (simple, get, set, standard).
     * @return @DefinicionReturn
     */
    public TipoMetodo geteMetodo() {
	return eMetodo;
    }
    
    /**
     * Establece el Tipo de método (simple, get, set, standard).
     * @param eMetodo @DefinicionParametro
     */
    public void seteMetodo(TipoMetodo eMetodo) {
	this.eMetodo = eMetodo;
    }   
    
    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGeneradorMetodo = ComponenteDistribuidorGeneradorMetodo.serialIdComponenteGeneradorMetodo++;
            this.previsualizar = false;
        }
    }
    
    public ComponenteDistribuidor convertirEnComponenteLibre() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    public ComponenteBeans generarRepresentacionBeans() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

//    @Override
//    protected Object clone() {
//        ComponenteDistribuidorGeneradorMetodo objClon = null;
//        //Primero se Clona la Referencia Local
//        objClon = (ComponenteDistribuidorGeneradorMetodo) super.clone();
//        //Ahora se hace la Clonación Profunda        
//        if(objCasosCompatibles != null){
//            ((ComponenteDistribuidorGeneradorMetodo)objClon).setObjCasosCompatibles(objCasosCompatibles);
//        }
//        if(objComponentesGenerados != null){
//            ((ComponenteDistribuidorGeneradorMetodo)objClon).setObjComponentesGenerados((ArrayList<ComponenteGenerado>)objComponentesGenerados.clone());
//        }
//        if(strClassPathMetodo != null){
//            ((ComponenteDistribuidorGeneradorMetodo)objClon).setStrClassPathMetodo(strClassPathMetodo);
//        }
//        return objClon;
//    }
    
    @Override
    public ArrayList<CodeContextLine> generateSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public CodeContextLine generateSingleSourceCodeSyntax(EnumTypeCodeSyntax eTypeCodeSintax) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldDefinitionConstant(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationInstance(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationClass(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationProperties(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseFieldInitializationGridBagConstraints(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodDefinitionEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementEvent(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionSet(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void generateSourceCodeSyntaxFaseMethodImplementFunctionGet(ArrayList<CodeContextLine> objSourceLinesCode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }    
}

